home *** CD-ROM | disk | FTP | other *** search
/ Complete Linux / Complete Linux.iso / docs / system / mail / transpor / ifmail23.z / ifmail23 / ifmail / iflib / packet.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-04-04  |  3.3 KB  |  175 lines

  1. #include <sys/types.h>
  2. #include <unistd.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <fcntl.h>
  6. #include <time.h>
  7. #include <sys/stat.h>
  8. #include "lutil.h"
  9. #include "ftn.h"
  10. #include "config.h"
  11. #include "bwrite.h"
  12.  
  13. #define HDR_RATE    19200
  14. #define HDR_VER        2
  15. #define HDR_PRODX    0x0000
  16. #define HDR_FILLER    0x0000
  17. #define HDR_CAPVALID    0x0100
  18. #define HDR_PRODCODE    0x0201
  19. #define HDR_CAPWORD    0x0001
  20. #define HDR_PRODDATA    0L
  21.  
  22. char passwd[9] = "\0\0\0\0\0\0\0\0";
  23.  
  24. extern char *pktname(faddr *,char);
  25. extern char *floname(faddr *,char);
  26.  
  27. #define MAXLEN 256
  28.  
  29. void mkdirs(name)
  30. char *name;
  31. {
  32.     extern int errno;
  33.     char buf[MAXLEN],*p,*q;
  34.     int rc;
  35.  
  36.     strncpy(buf,name,sizeof(buf)-1);
  37.     debug(2,"creating directory tree for \"%s\"",buf);
  38.     p=buf+1;
  39.     while ((q=strchr(p,'/')))
  40.     {
  41.         *q='\0';
  42.         rc=mkdir(buf,0700);
  43.         debug(2,"mkdir(\"%s\") errno %d",buf,rc?errno:0);
  44.         *q='/';
  45.         p=q+1;
  46.     }
  47. }
  48.  
  49. FILE *openpkt(addr,flavor)
  50. faddr *addr;
  51. char flavor;
  52. {
  53.     off_t pos;
  54.     FILE *pkt;
  55.     struct flock fl;
  56.     char *name;
  57.     struct tm *ptm;
  58.     fa_list *pa;
  59.     time_t t;
  60.     int i;
  61.     faddr *bestaka;
  62.  
  63.     debug(3,"openpkt entered");
  64.  
  65.     for (pa=pwlist;pa;pa=pa->next)
  66.     if (metric(pa->addr,addr) == 0)
  67.         strncpy(passwd,pa->addr->name,8);
  68.  
  69.     name=pktname(addr,flavor);
  70.  
  71.     mkdirs(name);
  72.  
  73.     if ((pkt=fopen(name,"r+")) == NULL)
  74.         pkt=fopen(name,"w");
  75.     if (pkt == NULL)
  76.     {
  77.         logerr("$Unable to open packet %s",name);
  78.         return NULL;
  79.     }
  80.     fl.l_type=F_WRLCK;
  81.     fl.l_whence=0;
  82.     fl.l_start=0L;
  83.     fl.l_len=0L;
  84.     if (fcntl(fileno(pkt),F_SETLKW,&fl) < 0)
  85.     {
  86.         logerr("$Unable to lock packet %s",name);
  87.         fclose(pkt);
  88.         return NULL;
  89.     }
  90.     pos=fseek(pkt,-2L,SEEK_END);
  91.     debug(2,"fseek (pkt,-2L,SEEK_END) result is %ld",pos);
  92.     pos=ftell(pkt);
  93.     debug(3,"ftell (pkt) result is %ld",pos);
  94.     if (pos == 0L)
  95.     {
  96.         time(&t);
  97.         ptm=localtime(&t);
  98.         bestaka=bestaka_s(addr);
  99.         iwrite(bestaka->node,pkt);
  100.         iwrite(addr->node        ,pkt);
  101.         iwrite(ptm->tm_year+1900 ,pkt);
  102.         iwrite(ptm->tm_mon       ,pkt);
  103.         iwrite(ptm->tm_mday      ,pkt);
  104.         iwrite(ptm->tm_hour      ,pkt);
  105.         iwrite(ptm->tm_min       ,pkt);
  106.         iwrite(ptm->tm_sec       ,pkt);
  107.         iwrite(HDR_RATE          ,pkt);
  108.         iwrite(HDR_VER           ,pkt);
  109.         iwrite(bestaka->net ,pkt);
  110.         iwrite(addr->net         ,pkt);
  111.         iwrite(HDR_PRODX         ,pkt);
  112.         for (i=0;i<8;i++) putc(passwd[i],pkt);
  113.         iwrite(bestaka->zone,pkt);
  114.         if (addr->zone) iwrite(addr->zone,pkt);
  115.         else iwrite(bestaka->zone,pkt);
  116.         iwrite(HDR_FILLER        ,pkt);
  117.         iwrite(HDR_CAPVALID      ,pkt);
  118.         iwrite(HDR_PRODCODE      ,pkt);
  119.         iwrite(HDR_CAPWORD       ,pkt);
  120.         iwrite(bestaka->zone,pkt);
  121.         if (addr->zone) iwrite(addr->zone,pkt);
  122.         else iwrite(bestaka->zone,pkt);
  123.         iwrite(bestaka->point,pkt);
  124.         iwrite(addr->point       ,pkt);
  125.         lwrite(HDR_PRODDATA      ,pkt);
  126.     }
  127.  
  128.     return pkt;
  129. }
  130.  
  131. FILE *openflo(addr,flavor)
  132. faddr *addr;
  133. char flavor;
  134. {
  135.     FILE *flo;
  136.     struct flock fl;
  137.     char *name;
  138.  
  139.     debug(3,"openflo entered");
  140.  
  141.     name=floname(addr,flavor);
  142.  
  143.     mkdirs(name);
  144.  
  145.     if ((flo=fopen(name,"r+")) == NULL)
  146.         flo=fopen(name,"w");
  147.     if (flo == NULL)
  148.     {
  149.         logerr("$Unable to open packet %s",name);
  150.         return NULL;
  151.     }
  152.     fl.l_type=F_WRLCK;
  153.     fl.l_whence=0;
  154.     fl.l_start=0L;
  155.     fl.l_len=0L;
  156.     if (fcntl(fileno(flo),F_SETLKW,&fl) < 0)
  157.     {
  158.         logerr("$Unable to lock flo file %s",name);
  159.         fclose(flo);
  160.         return NULL;
  161.     }
  162.  
  163.     return flo;
  164. }
  165.  
  166. void closepkt(pkt)
  167. FILE *pkt;
  168. {
  169.     debug(3,"closepkt entered");
  170.  
  171.     iwrite(0,pkt);
  172.  
  173.     fclose(pkt);    /* close also discards lock */
  174. }
  175.